package io.jee.medusa.service;

import io.jee.medusa.orm.DaoSupport;
import io.jee.medusa.orm.condition.ConditionGroup;
import io.jee.medusa.orm.pager.Pager;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;

public interface ServiceInterface<T> {
	/**
	 * 保存实体对象
	 * 
	 * @param entity
	 * @return 主键值
	 */
	public Serializable save(T entity);
	
	/**
	 * 保存多个对象
	 * @author ynshun
	 * @param entitys
	 */
	public void save(Collection<T> entitys);

	/**
	 * 新增或修改实体对象
	 * 
	 * @param entity
	 */
	public void saveOrUpdate(T entity);

	/**
	 * 修改实体对象
	 * 
	 * @param entity
	 */
	public void update(T entity);
	
	/**
	 * 根据条件修改数据
	 * 
	 * @param key
	 * @param value
	 * @param group
	 */
	public void update(String key, Object value, ConditionGroup group);

	/**
	 * 删除实体对象
	 * 
	 * @param entity
	 */
	void delete(T entity);

	/**
	 * 根据条件删除
	 * 
	 * @param key
	 * @param value
	 * @return
	 */
	public int delete(String key, Object value);

	/**
	 * 根据条件删除
	 * 
	 * @param key
	 * @param values
	 * @return
	 */
	public int delete(String key, Object[] values);

	/**
	 * 根据条件删除
	 * @author ynshun
	 * @param group
	 * @return
	 */
	public int delete(ConditionGroup group);
	
	/**
	 * 根据条件修改
	 * 
	 * @param key
	 * @param value
	 * @param id
	 *            主键值
	 */
	public void update(String key, Object value, Serializable id);

	/**
	 * 根据ID获取实体对象
	 * 
	 * @param id
	 * @return
	 */
	public T get(Serializable id);
	
	/**
	 * 根据条件查询对象
	 * @author ynshun
	 * @param group
	 * @return
	 */
	public T get(ConditionGroup group);

	/**
	 * 根据ID懒加载实体对象
	 * 
	 * @param id
	 * @return
	 */
	public T load(Serializable id);

	/**
	 * 根据条件查询实体对象
	 * 
	 * @param key
	 * @param value
	 * @return
	 */
	public T unique(String key, Object value);

	/**
	 * 根据条件查询数据列表
	 * 
	 * @param key
	 * @param value
	 * @return
	 */
	public List<T> list(String key, Object value);

	/**
	 * 根据条件查询数据列表并排序
	 * 
	 * @param key
	 * @param value
	 * @param shortType
	 * @param shortProperty
	 * @return
	 */
	public List<T> list(String key, Object value, String shortType,
			String shortProperty);

	/**
	 * 一个关键字多个值in条件查询集合
	 * 
	 * @param key
	 * @param values
	 * @return
	 */
	public List<T> list(String key, Object[] values);

	/**
	 * 根据参数key-value查询数据列表
	 * 
	 * @param params
	 * @return
	 */
	public List<T> list(Map<String, Object> params);

	/**
	 * 根据查询条件查询数据列表
	 * 
	 * @param group
	 * @return
	 */
	public List<T> list(ConditionGroup group);

	/**
	 * 根据查询条件分页查询数据
	 * 
	 * @param pager
	 * @param group
	 * @return
	 */
	public Pager<T> list(Pager<T> pager, ConditionGroup group);
	
	/**
	 * 根据条件分页并排序查询
	 * @param pager
	 * @param group
	 * @param orderType
	 * @param orderProperty
	 * @return
	 */
	public Pager<T> list(Pager<T> pager, ConditionGroup group, String orderType, String orderProperty);

	/**
	 * 查询对象所有数据列表
	 * 
	 * @return
	 */
	public List<T> listAll();
	
	public List<T> listAll(String orderType, String orderProperty);

	/**
	 * 根据条件统计数据数量
	 * 
	 * @param key
	 * @param value
	 * @return
	 */
	public long count(String key, Object value);

	/**
	 * 根据条件统计数据数量
	 * 
	 * @param group
	 * @return
	 */
	public long count(ConditionGroup group);

	/**
	 * 根据条件统计数据数量
	 * 
	 * @param group
	 * @return
	 */
	public long count(Map<String, Object> params);

	/**
	 * 获取对象总记录条数
	 * 
	 * @return
	 */
	public long countAll();

	/**
	 * 
	 * @Description : 获取Dao
	 * @Method :
	 * @author : ynshun(ynshun@163.com)
	 * @date : 2014年10月31日
	 * @return
	 */
	public DaoSupport<T> getDao();
}
